# -*- coding: UTF-8 -*-
import sys
import re
from PyQt5.QtWidgets import QFileDialog, QTreeWidgetItem, QInputDialog, QMessageBox, QMainWindow, QApplication
from untitled import Ui_MainWindow
from PyQt5.QtCore import Qt, QThread
from dealtxt import MyTxtToExcel
from PyQt5.QtCore import QBasicTimer
import os
import difflib
import copy

from CommonData import CommonData as cd

'''1表示上旬，月份1-6。 2表示下旬，月份7-12'''

tree_types_name = {
    'PRS': ['本站气压', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均本站气压', '日最高本站气压', '日最低本站气压', '平均本站气压质量控制码','日最高本站气压质量控制码', '日最低本站气压质量控制码','+20000'],
    'TEM': ['气温', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均气温', '日最高气温', '日最低气温', '平均气温控制码', '日最高气温质量控制码','日最低气温质量控制码'],
    'RHU': ['相对湿度', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均相对湿度', '最小相对湿度(仅自己)', '平均相对湿度质量控制码','最小相对湿度质量控制码','+300'],
    'PRE': ['降水', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '20-8时降水量', '8-20时降水量', '20-20时累计降水量', '20-8时降水量质量控制码','8-20时累计降水量质量控制码', '20-20时降水量质量控制码','32700', '32XXX', '31XXX', '30XXX'],
    'EVP': ['蒸发', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '小型蒸发量', '大型蒸发量', '小型蒸发量质量控制码', '大型蒸发量质量控制码','+1000'],
    'WIN': ['风向风速', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均风速', '最大风速', '最大风速的风向', '极大风速', '极大风速的风向', '平均风速质量控制码','最大风速质量控制码', '最大风速的风向质量控制码', '极大风速质量控制码', '极大风速的风向质量控制码','+1000','+100','90X','95X'],
    'SSD': ['日照', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '日照时数', '日照时数质量控制码'],
    'QRA': ['辐射', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '太阳总辐射日曝辐量'],
    '组合气象因子': ['组合气象因子', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '20-20时降水量', '极大风速', '极大风速的风向', '平均本站气压', '平均风速', '平均气温', '平均水汽压', '平均相对湿度','日照时数', '日最低本站气压', '日最低气温', '日最高本站气压', '日最高气温', '最大风速', '最大风速的风向', '最小相对湿度', '+20000', '32700'],
    'GST_0CM': ['0cm地温', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均地表气温', '日最高地表气温', '日最低地表气温', '平均地表气温质量控制码','日最高地表气温质量控制码', '日最低地表气温质量控制码','+10000', '-10000'],
    'VAP': ['水汽压','区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均水汽压', '日最高水汽压','日最低水汽压', '平均水汽压质量控制码', '日最高水汽压质量控制码', '日最低水汽压质量控制码'],
    'GSS': ['积雪','区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '日积雪深度', '日雪压','日积雪深度质量控制码', '日雪压质量控制码'],
    'ICE': ['电线结冰', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '南北电线结冰类型', '南北电线结冰重量', '南北电线结冰直径', '南北电线结冰厚度', '东西电线结冰类型', '东西电线结冰重量',
            '东西电线结冰直径', '东西电线结冰厚度', '出现结冰时气温', '出现结冰时风向', '出现结冰时风速', '南北电线结冰类型质量控制码', '南北电线结冰重量质量控制码', '南北电线结冰直径质量控制码',
            '南北电线结冰厚度质量控制码', '东西电线结冰类型质量控制码', '东西电线结冰重量质量控制码', '东西电线结冰直径质量控制码', '东西电线结冰厚度质量控制码', '出现结冰时气温质量控制码', '出现结冰时风向质量控制码', '出现结冰时风速质量控制码'],
    'GST': ['地温', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均5cm地温', '平均10cm地温', '平均15cm地温', '平均20cm地温', '平均40cm地温', '平均80cm地温', '平均160cm地温', '平均320cm地温', '平均5cm地温质量控制码',
            '平均10cm地温质量控制码',  '平均15cm地温质量控制码', '平均20cm地温质量控制码', '平均40cm地温质量控制码', '平均80cm地温质量控制码', '平均160cm地温质量控制码', '平均320cm地温质量控制码'],
    'GLT': ['草面温度', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '日平均草面温度', '日最高草面温度', '日最低草面温度', '日平均草面温度质量控制码', '日最高草面温度质量控制码', '日最低草面温度质量控制码'],
    'FRS': ['冻土', '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '第一冻土层上界值', '第一冻土层下界值', '第二冻土层上界值', '第二冻土层下界值',
            '第一冻土层上界值质量控制码', '第一冻土层下界值质量控制码', '第二冻土层上界值质量控制码', '第二冻土层下界值质量控制码'],
    'CLO': ['云量',  '区站号', '经度', '纬度', '观测场拔海高度', '年', '月', '平均总云量', '平均低云量', '平均总云量质量控制码', '平均低云量控制码'],
}

# 特值的解释
tree_specil_exp = {
    'PRS': ['气压极值取自定值时,在原值上加20000'],
    'RHU': ['最小相对湿度取自定值时,在原值上+300'],
    'PRE': ['表示降水"微量"', 'XXX为纯雾露霜', 'XXX为雨和雪的总量', 'XXX为雪量(仅包括雨夹雪,雪暴)'],
    'EVP': ['蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000'],
    'WIN': ['当风速超过仪器测量上限时,在上限数据基础上加1000', '当表示风向为八风向时,在原值上加100', '风向出现X个时,风向数据个数用X表示', '风向至少出现X个时,风向数据用个数X表示'],
    'GST_0CM': ['实际温度(零上)超仪器上限刻度,在上限数据基础上加10000', '实际温度(零下)超仪器上限刻度,在上限数据基础上减10000'],
    '组合气象因子': ['气压极值取自定值时,在原值上加20000', '表示降水"微量"']
}

tree_specil_exp_copy = {
    'PRS': ['气压极值取自定值时,在原值上加20000'],
    'RHU': ['最小相对湿度取自定值时,在原值上+300'],
    'PRE': ['表示降水"微量"', 'XXX为纯雾露霜', 'XXX为雨和雪的总量', 'XXX为雪量(仅包括雨夹雪,雪暴)'],
    'EVP': ['蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000'],
    'WIN': ['当风速超过仪器测量上限时,在上限数据基础上加1000', '当表示风向为八风向时,在原值上加100', '风向出现X个时,风向数据个数用X表示', '风向至少出现X个时,风向数据用个数X表示'],
    'GST_0CM': ['实际温度(零上)超仪器上限刻度,在上限数据基础上加10000', '实际温度(零下)超仪器上限刻度,在上限数据基础上减10000'],
    '组合气象因子': ['气压极值取自定值时,在原值上加20000', '表示降水"微量"']
}

# -1:无  0:设定为0  1：提取XXX值
specil_types_value = {
    'PRS':{ '+20000(气压极值取自定值时,在原值上加20000)':[]},
    'RHU':{'+300(最小相对湿度取自定值时,在原值上+300)':[]},
    'PRE':{ '32700(表示降水"微量")':[], '32XXX(XXX为纯雾露霜)':[], '31XXX(XXX为雨和雪的总量)':[], '30XXX(XXX为雪量(仅包括雨夹雪,雪暴))':[]},
    'EVP':{'+1000(蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000)':[]},
    'WIN':{'+1000(当风速超过仪器测量上限时,在上限数据基础上加1000)':[],'+100(当表示风向为八风向时,在原值上加100)':[],'90X(风向出现X个时,风向数据个数用X表示)':[],'95X(风向至少出现X个时,风向数据用个数X表示)':[]},
    'GST_0CM':{'+10000(实际温度(零上)超仪器上限刻度,在上限数据基础上加10000)':[], '-10000(实际温度(零下)超仪器上限刻度,在上限数据基础上减10000)':[]},
    '组合气象因子': {'+20000(气压极值取自定值时,在原值上加20000)': [], '32700(表示降水"微量")': []}
}

specil_types_value_copy = {
    'PRS':{ '+20000(气压极值取自定值时,在原值上加20000)':[]},
    'RHU':{'+300(最小相对湿度取自定值时,在原值上+300)':[]},
    'PRE':{ '32700(表示降水"微量")':[], '32XXX(XXX为纯雾露霜)':[], '31XXX(XXX为雨和雪的总量)':[], '30XXX(XXX为雪量(仅包括雨夹雪,雪暴))':[]},
    'EVP':{'+1000(蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000)':[]},
    'WIN':{'+1000(当风速超过仪器测量上限时,在上限数据基础上加1000)':[],'+100(当表示风向为八风向时,在原值上加100)':[],'90X(风向出现X个时,风向数据个数用X表示)':[],'95X(风向至少出现X个时,风向数据用个数X表示)':[]},
    'GST_0CM':{'+10000(实际温度(零上)超仪器上限刻度,在上限数据基础上加10000)':[], '-10000(实际温度(零下)超仪器上限刻度,在上限数据基础上减10000)':[]},
    '组合气象因子': {'+20000(气压极值取自定值时,在原值上加20000)': [], '32700(表示降水"微量")': []}
}

comb_specil_types_value = {
    '组合气象因子' : {'+20000(气压极值取自定值时,在原值上加20000)' : [], '32700(表示降水"微量")': []}
}

comb_specil_types_value_copy = {
    '组合气象因子': {'+20000(气压极值取自定值时,在原值上加20000)': [], '32700(表示降水"微量")': []}
}

# 特值与解释
specil_to_exp = {
    '+1000': '(蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000)',
    '+10000': '(实际温度(零上)超仪器上限刻度,在上限数据基础上加10000)', '-10000': '(实际温度(零下)超仪器上限刻度,在上限数据基础上减10000)',
    '32700': '(表示降水"微量")', '32XXX': '(XXX为纯雾露霜)', '31XXX': '(XXX为雨和雪的总量)', '30XXX': '(XXX为雪量(仅包括雨夹雪,雪暴))',
    '+20000': '(气压极值取自定值时,在原值上加20000)',
    '+300': '(最小相对湿度取自定值时,在原值上+300)',
    '+1000': '(当风速超过仪器测量上限时,在上限数据基础上加1000)', '+100': '(当表示风向为八风向时,在原值上加100)', '90X': '(风向出现X个时,风向数据个数用X表示)', '95X': '(风向至少出现X个时,风向数据用个数X表示)'
}

specil_select_value = []

tree_name_types = {
    '平均本站气压': 'PRS', '日最高本站气压': 'PRS', '日最低本站气压': 'PRS', '平均本站气压质量控制码': 'PRS', '日最高本站气压质量控制码': 'PRS','日最低本站气压质量控制码': 'PRS',
    '平均气温': 'TEM', '日最高气温': 'TEM', '日最低气温': 'TEM', '平均气温控制码': 'TEM', '日最高气温质量控制码': 'TEM','日最低气温质量控制码': 'TEM',
    '平均相对湿度': 'RHU', '最小相对湿度(仅自己)': 'RHU', '平均相对湿度质量控制码': 'RHU', '最小相对湿度质量控制码': 'RHU',
    '20-8时降水量': 'PRE', '8-20时降水量': 'PRE', '20-20时累计降水量': 'PRE', '20-8时降水量质量控制码': 'PRE', '8-20时累计降水量质量控制码': 'PRE','20-20时降水量质量控制码': 'PRE',
    '小型蒸发量': 'EVP', '大型蒸发量': 'EVP', '小型蒸发量质量控制码': 'EVP', '大型蒸发量质量控制码': 'EVP',
    '平均风速': 'WIN','最大风速': 'WIN', '最大风速的风向': 'WIN', '极大风速': 'WIN', '极大风速的风向': 'WIN', '平均风速质量控制码': 'WIN', '最大风速质量控制码': 'WIN','最大风速的风向质量控制码' : 'WIN', '极大风速质量控制码': 'WIN', '极大风速的风向质量控制码': 'WIN',
    '日照时数': 'SSD', '日照时数质量控制码': 'SSD','平均地表气温': 'GST_0CM', '日最高地表气温': 'GST_0CM', '日最低地表气温': 'GST_0CM', '平均地表气温质量控制码': 'GST_0CM', '日最高地表气温质量控制码': 'GST_0CM','日最低地表气温质量控制码': 'GST_0CM',
    '太阳总辐射日曝辐量': 'QRA','平均水汽压':'VAP', '日最高水汽压':'VAP', '日最低水汽压':'VAP', '平均水汽压质量控制码':'VAP', '日最高水汽压质量控制码':'VAP', '日最低水汽压质量控制码':'VAP',
    '日积雪深度':'GSS', '日雪压':'GSS', '日积雪深度质量控制码':'GSS', '日雪压质量控制码':'GSS', '南北电线结冰类型':'ICE', '南北电线结冰重量':'ICE', '南北电线结冰直径':'ICE', '南北电线结冰厚度':'ICE',
    '东西电线结冰类型':'ICE', '东西电线结冰重量':'ICE', '东西电线结冰直径':'ICE', '东西电线结冰厚度':'ICE', '出现结冰时气温':'ICE', '出现结冰时风向':'ICE', '出现结冰时风速':'ICE',
    '南北电线结冰类型质量控制码':'ICE', '南北电线结冰重量质量控制码':'ICE', '南北电线结冰直径质量控制码':'ICE', '南北电线结冰厚度质量控制码':'ICE', '东西电线结冰类型质量控制码':'ICE',
    '东西电线结冰重量质量控制码':'ICE', '东西电线结冰直径质量控制码':'ICE', '东西电线结冰厚度质量控制码':'ICE', '出现结冰时气温质量控制码':'ICE', '出现结冰时风向质量控制码':'ICE', '出现结冰时风速质量控制码':'ICE',
    '平均5cm地温':'GST', '平均10cm地温':'GST', '平均15cm地温':'GST', '平均20cm地温':'GST', '平均40cm地温':'GST', '平均80cm地温':'GST', '平均160cm地温':'GST', '平均320cm地温':'GST', '平均5cm地温质量控制码':'GST',
     '平均10cm地温质量控制码':'GST', '平均15cm地温质量控制码':'GST', '平均20cm地温质量控制码':'GST', '平均40cm地温质量控制码':'GST', '平均80cm地温质量控制码':'GST',
    '平均160cm地温质量控制码':'GST', '平均320cm地温质量控制码':'GST', '第一冻土层上界值':'FRS', '第一冻土层下界值':'FRS', '第二冻土层上界值':'FRS', '第二冻土层下界值':'FRS', '第一冻土层上界值质量控制码':'FRS',
    '第一冻土层下界值质量控制码':'FRS', '第二冻土层上界值质量控制码':'FRS', '第二冻土层下界值质量控制码':'FRS', '日平均草面温度':'GLT', '日最高草面温度':'GLT', '日最低草面温度':'GLT',
    '日平均草面温度质量控制码':'GLT', '日最高草面温度质量控制码':'GLT', '日最低草面温度质量控制码':'GLT','平均总云量':'CLO', '平均低云量':'CLO', '平均总云量质量控制码':'CLO', '平均低云量控制码':'CLO',
}

comb_tree_name_types = {
'20-20时降水量':'组合气象因子','极大风速':'组合气象因子','极大风速的风向':'组合气象因子','平均本站气压':'组合气象因子','平均风速':'组合气象因子',
    '平均气温':'组合气象因子','平均水汽压':'组合气象因子','平均相对湿度':'组合气象因子','日照时数':'组合气象因子','日最低本站气压':'组合气象因子',
    '日最低气温':'组合气象因子','日最高本站气压':'组合气象因子','日最高气温':'组合气象因子','最大风速':'组合气象因子','最大风速的风向':'组合气象因子',
    '最小相对湿度':'组合气象因子',
}

tree_unit = {
    'PRS': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1hPa', '0.1hPa', '0.1hPa', '无', '无', '无','无','无'],
    'TEM': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1°C', '0.1°C', '0.1°C', '无', '无', '无'],
    'RHU': ['无', '度、分', '度、分', '0.1米', '年', '月', '1%', '1%', '无', '无','无'],
    'PRE': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1mm', '0.1mm', '0.1mm', '无', '无', '无','无','无','无','无'],
    'EVP': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1mm', '0.1mm', '无', '无','无'],
    'WIN': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1m/s', '0.1m/s', '16方位', '0.1m/s', '16方位', '无', '无', '无', '无', '无','无','无','无','无'],
    'SSD': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1小时', '无'],
    'GST_0CM': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1°C', '0.1°C', '0.1°C', '无', '无', '无','无','无'],
    'QRA': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.01MJ.m^-2'],
    '组合气象因子': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1mm', '0.1m/s', '16方位', '0.1hPa', '0.1m/s', '0.1°C', '0.1hPa', '1%', '0.1小时', '0.1hPa','0.1°C', '0.1hPa', '0.1°C', '0.1m/s', '16方位', '1%', '无','无'],
    'VAP': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1hPa', '0.1hPa', '0.1hPa', '无', '无', '无'],
    'CLO': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1成', '0.1成', '无', '无'],
    'GSS': ['无', '度、分', '度、分', '0.1米', '年', '月','1cm', '0.1g/cm^2','无', '无'],
    'ICE': ['无', '度、分', '度、分', '0.1米', '年', '月', '无', 'g/m','mm', 'mm', '无', 'g/m', 'mm','mm','0.1°C','1°','0.1m/s','无', '无', '无','无', '无', '无','无', '无', '无','无', '无'],
    'GST': ['无', '度、分', '度、分', '0.1米', '年', '月','0.1°C','0.1°C','0.1°C','0.1°C','0.1°C','0.1°C','0.1°C','0.1°C','无', '无', '无','无', '无', '无','无', '无'],
    'FRS': ['无', '度、分', '度、分', '0.1米', '年', '月', '1cm', '1cm', '1cm', '1cm', '无', '无', '无', '无'],
    'GLT': ['无', '度、分', '度、分', '0.1米', '年', '月', '0.1°C','0.1°C','0.1°C','无', '无', '无'],
}

# comb_tree_unit = {
#     '组合气象因子':['无','年','月','0.1mm','0.1m/s','16方位','0.1hPa','0.1m/s','0.1°C','0.1hPa','1%','0.1小时','0.1hPa','0.1°C','0.1hPa','0.1°C','0.1m/s','16方位','1%']
# }

'''默认为替换'''
replace_type_name = {  # 作为sheet要用的
    'PRS': {'平均本站气压': '替换', '日最高本站气压': '替换', '日最低本站气压': '替换', '平均本站气压质量控制码': '替换', '日最高本站气压质量控制码': '替换','日最低本站气压质量控制码': '替换', },
    'TEM': {'平均气温': '替换', '日最高气温': '替换', '日最低气温': '替换', '平均气温控制码': '替换', '日最高气温质量控制码': '替换', '日最低气温质量控制码': '替换', },
    'RHU': {'日': '替换', '平均相对湿度': '替换', '最小相对湿度(仅自己)': '替换', '平均相对湿度质量控制码': '替换', '最小相对湿度质量控制码': '替换', },
    'PRE': {'20-8时降水量': '替换', '8-20时降水量': '替换', '20-20时累计降水量': '替换', '20-8时降水量质量控制码': '替换', '8-20时累计降水量质量控制码': '替换','20-20时降水量质量控制码': '替换', },
    'EVP': {'小型蒸发量': '替换', '大型蒸发量': '替换', '小型蒸发量质量控制码': '替换', '大型蒸发量质量控制码': '替换', },
    'WIN': {'平均风速': '替换', '最大风速': '替换', '最大风速的风向': '替换', '极大风速': '替换', '极大风速的风向': '替换', '平均风速质量控制码': '替换','最大风速质量控制码': '替换', '最大风速的风向质量控制码': '替换', '极大风速质量控制码': '替换', '极大风速的风向质量控制码': '替换', },
    'SSD': {'日照时数': '替换', '日照时数质量控制码': '替换', },
    'GST_0CM': {'平均地表气温': '替换', '日最高地表气温': '替换', '日最低地表气温': '替换', '平均地表气温质量控制码': '替换', '日最高地表气温质量控制码': '替换','日最低地表气温质量控制码': '替换', },
    'QRA': {'太阳总辐射日曝辐量': '替换'},
    'VAP': {'平均水汽压':'替换', '日最高水汽压':'替换', '日最低水汽压':'替换', '平均水汽压质量控制码':'替换', '日最高水汽压质量控制码':'替换', '日最低水汽压质量控制码':'替换', },
    'GSS': {'日积雪深度':'替换', '日雪压':'替换', '日积雪深度质量控制码':'替换', '日雪压质量控制码':'替换', },
    'ICE': {'南北电线结冰类型':'替换', '南北电线结冰重量':'替换', '南北电线结冰直径':'替换', '南北电线结冰厚度':'替换', '东西电线结冰类型':'替换', '东西电线结冰重量':'替换', '东西电线结冰直径':'替换', '东西电线结冰厚度':'替换', '出现结冰时气温':'替换', '出现结冰时风向':'替换', '出现结冰时风速':'替换', '南北电线结冰类型质量控制码':'替换', '南北电线结冰重量质量控制码':'替换', '南北电线结冰直径质量控制码':'替换', '南北电线结冰厚度质量控制码':'替换', '东西电线结冰类型质量控制码':'替换', '东西电线结冰重量质量控制码':'替换', '东西电线结冰直径质量控制码':'替换', '东西电线结冰厚度质量控制码':'替换', '出现结冰时气温质量控制码':'替换', '出现结冰时风向质量控制码':'替换', '出现结冰时风速质量控制码':'替换', },
    'GST': {'平均5cm地温':'替换', '平均10cm地温':'替换', '平均15cm地温':'替换', '平均20cm地温':'替换', '平均40cm地温':'替换', '平均80cm地温':'替换', '平均160cm地温':'替换', '平均320cm地温':'替换', '平均5cm地温质量控制码':'替换', '平均10cm地温质量控制码':'替换', '平均15cm地温质量控制码':'替换', '平均20cm地温质量控制码':'替换', '平均40cm地温质量控制码':'替换', '平均80cm地温质量控制码':'替换', '平均160cm地温质量控制码':'替换', '平均320cm地温质量控制码':'替换', },
    'FRS': {'第一冻土层上界值':'替换', '第一冻土层下界值':'替换', '第二冻土层上界值':'替换', '第二冻土层下界值':'替换', '第一冻土层上界值质量控制码':'替换', '第一冻土层下界值质量控制码':'替换', '第二冻土层上界值质量控制码':'替换', '第二冻土层下界值质量控制码':'替换', },
    'GLT': {'日平均草面温度':'替换', '日最高草面温度':'替换', '日最低草面温度':'替换', '日平均草面温度质量控制码':'替换', '日最高草面温度质量控制码':'替换', '日最低草面温度质量控制码':'替换', },
    'CLO': {'平均总云量':'替换', '平均低云量':'替换', '平均总云量质量控制码':'替换', '平均低云量控制码':'替换'},
}
list_root_name = []  # 存在的根节点列表
selected_root_child = {'PRS': [], 'TEM': [], 'RHU': [], 'PRE': [], 'EVP': [], 'WIN': [], 'SSD': [], 'QRA': [] ,'组合气象因子': [], 'GST_0CM':[],'VAP':[], 'GSS':[], 'ICE':[], 'GST':[], 'FRS':[], 'GLT': [], 'CLO':[]}  # 已选择要填入表格的
selected_root_child_copy = {'PRS': [], 'TEM': [], 'RHU': [], 'PRE': [], 'EVP': [], 'WIN': [], 'SSD': [], 'QRA': [] ,'组合气象因子': [], 'GST_0CM':[],'VAP':[], 'GSS':[], 'ICE':[], 'GST':[], 'FRS':[], 'GLT': [],'CLO':[]}  # 用于第二次处理数据的时候的copy

# comb_selected_root_child = {'组合气象因子': []}
# comb_selected_root_child_copy = {'组合气象因子': []}
'''选择的年份和月份数据'''
selected_root_types_year = {}
selected_year = {}
selected_root_types_month = {}

class MyMainForm(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        self.setWindowTitle(cd.version)
        self.cwd = "C:"  # 默认为C盘开始寻找
        self.float_value_flag = '否'  # 控制是否要自定义真实值乘以系数，默认为0.1
        self.float_value = 0.1  # 真实值系数，默认为0.1
        self.lose_value_flag = '否'  # 控制是否从键盘获取缺失值
        self.lose_value = '缺失'  # 默认为缺失
        self.separate_value = '否'  # 控制是否要将sheet分隔开来
        self.data_floder = ''
        self.out_floder = ''
        self.replace_file = ''
        self.conform_file = ''  # 整合文件
        self.replace_falg = '否'
        self.flag = 1  # 控制输入值
        self.run_thread = None
        self.timer = QBasicTimer()
        self.step = 0
        self.dist_num = 'A'  # 区站号，省份，站名，经纬度，海拔
        self.province = 'B'
        self.site_num = 'C'
        self.long = 'D'
        self.lat = 'E'
        self.alt = 'F'
        '''数据树结构'''
        self.treeWidget.setColumnCount(5)
        self.treeWidget.setHeaderLabels(['气象缩写', '中文名', '气象因子', '单位', '是否替换'])  # 设置标题
        self.treeWidget.setColumnWidth(0, int(3 * 30))  # 设置宽度
        self.treeWidget.setColumnWidth(1, int(2 * 35))
        self.treeWidget.setColumnWidth(2, int(4 * 35))
        self.treeWidget.setColumnWidth(3, int(1.5 * 40))
        self.treeWidget.setColumnWidth(4, int(1.5 * 35))
        '''信号槽'''
        self.treeWidget.itemChanged.connect(self.onclick)
        self.btn_data_floder.clicked.connect(self.getDataFloder)  # 获取数据集文件夹位置
        self.btn_print_floder.clicked.connect(self.getPrintFloder)  # 获取输出文件夹
        self.btn_public_floder.clicked.connect(self.getPublicFile)  # 获得公共处理数据文件
        self.text_lose.editingFinished.connect(self.getLoseValue)  # 获得缺失值
        self.text_float.editingFinished.connect(self.getTrueValue)  # 获得真实值
        self.float_check_box.stateChanged.connect(self.floatState)
        self.public_check_box.stateChanged.connect(self.publicState)  # 共用字段替换
        self.separate_check_box.stateChanged.connect(self.separateState)
        self.comboBox_dist_num.currentIndexChanged.connect(self.changeDistNum)  # 改变区站号的值
        self.comboBox_province.currentIndexChanged.connect(self.changeProvince) # 改变省份
        self.comboBox_site_num.currentIndexChanged.connect(self.changeSiteNum)  # 改变站名
        self.comboBox_long.currentIndexChanged.connect(self.changeLong) # 改变经度
        self.comboBox_lat.currentIndexChanged.connect(self.changeLat)   # 改变纬度
        self.comboBox_alt.currentIndexChanged.connect(self.changeAlt)   # 改变海拔
        self.btn_star.clicked.connect(self.starButtn)
        self.btn_end.clicked.connect(self.endButtn)
        self.special_check.clicked.connect(self.setSpecialCheck)

    def get_abnormal(fun):
        def abnormal(self, *args, **kwargs):
            try:
                return fun(self, *args, **kwargs)
            except Exception as e:
                print("异常信息:{},异常方法:{}".format(e, fun.__name__))

        return abnormal  # 没有返回值

    #@get_abnormal
    def setSpecialCheck(self, t):
        if self.special_check.isChecked():
            cd.special_check = True
            cd.special_length_modify = -3
            if len(list_root_name) != 0:
                self.treeWidget.clear()
                MyMainForm.print_tree(self)
                self.treeWidget.setItemsExpandable(True)
        else:
            cd.special_check = False
            cd.special_length_modify = 0
            if len(list_root_name) != 0:
                self.treeWidget.clear()
                MyMainForm.print_tree(self)
                self.treeWidget.setItemsExpandable(True)

    def get_equal_rate_1(self, str1, str2):
        return difflib.SequenceMatcher(None, str1, str2).quick_ratio()

    def get_exp_value(self, exp):
        value = ''
        if len(exp) > 1:
            for k in exp:
                value += k
        else:
            value = exp[0]
        return value
    def changeDistNum(self):
        index = self.comboBox_dist_num.currentIndex()
        self.dist_num = self.comboBox_dist_num.itemText(index)

    def changeProvince(self):
        index = self.comboBox_province.currentIndex()
        self.province = self.comboBox_province.itemText(index)
    def changeSiteNum(self):
        index = self.comboBox_site_num.currentIndex()
        self.site_num = self.comboBox_site_num.itemText(index)
    def changeLong(self):
        index = self.comboBox_long.currentIndex()
        self.long = self.comboBox_long.itemText(index)
    def changeLat(self):
        index = self.comboBox_lat.currentIndex()
        self.lat = self.comboBox_lat.itemText(index)
    def changeAlt(self):
        index = self.comboBox_alt.currentIndex()
        self.alt = self.comboBox_alt.itemText(index)

    # #@get_abnormal
    def getDataFloder(self):
        global selected_root_child, selected_root_types_year, selected_root_types_month, tree_specil_exp, specil_types_value
        global tree_types_name, tree_specil_exp, tree_specil_exp_copy, specil_types_value, specil_types_value_copy, tree_name_types, tree_unit
        file = QFileDialog.getExistingDirectory(self, directory=self.cwd).replace("/", "\\")  # 获取文件
        self.text_data.setText(file)
        if self.text_print.text() == '':
            self.text_print.setText(file[:2] + "\输出")  # 将数据集的盘符作为输出集的位置
        self.data_floder = self.text_data.text()
        if self.data_floder != '':
            if len(list_root_name) != 0:
                list_root_name.clear()  # 第二次处理的时候，需要将根根节点的数据清除完毕
                selected_root_child = copy.deepcopy(selected_root_child_copy)
                self.treeWidget.clear()
                tree_specil_exp = copy.deepcopy(tree_specil_exp_copy)
                specil_types_value = copy.deepcopy(specil_types_value_copy)
                # print(tree_specil_exp, tree_specil_exp_copy)
            MyMainForm.print_tree(self)

<<<<<<< HEAD
    #@get_abnormal
=======
    @get_abnormal
>>>>>>> 93d9ef9bbb775d0c1b8c98405f600a1c4039aae8
    def print_tree(self):
        global tree_types_name, tree_unit
        poi = self.data_floder
        for file in os.listdir(poi):
            if os.path.isfile(poi + "\\" + file) is False:  # 非文件，是文件夹就进入次判断
                root = os.listdir(poi + "\\" + file)[0]
<<<<<<< HEAD
                # print("root:", root)
=======
<<<<<<< HEAD
                print("root:", root)
=======
>>>>>>> 9b988744b9094e235d0206c22ab1011802914ecc
>>>>>>> 0f0c72be4dcc2e15fd778f6cbc949159bd679275
                if '0cm' in root or '0CM' in root:
                    list_root_name.append('GST_0CM')
                else:
                    temp = re.findall(r'DAY-(\w{3,7})', root)
                    if len(temp) != 0:
                        list_root_name.append(temp[0])
            else:
<<<<<<< HEAD
                temp = re.findall(r'DAY-(\w{3,7})', file)
=======
                temp = re.findall(r'DAY-(\w{3,6})', file)
>>>>>>> 9b988744b9094e235d0206c22ab1011802914ecc
                if '0cm' in file or '0CM' in file:
                    if 'GST_0CM' not in list_root_name:  # 0cm在文件中，并且list_root_name中不存在GST_0cm ，
                        list_root_name.append('GST_0CM')
                else:
                    if len(temp) != 0:
                        if temp[0] not in list_root_name:
                            list_root_name.append(temp[0])
        '''找到对应的月份和年份的数据'''
        file = self.data_floder
        temp = os.listdir(file)
        if os.path.isfile(file + "\\" + temp[0]) is False:  # 如果是非文件,则表示是子目录
            for floder in temp:
<<<<<<< HEAD
                name = re.findall(r"\w{3,7}", floder)[0]  # 名字
                if '0CM' in floder or '0cm' in floder:
=======
                name = re.findall(r"\w{3,6}", floder)[0]  # 名字
<<<<<<< HEAD
                if '0CM' in floder or '0cm' in floder:
=======
                if '0CM' in floder or '0CM' in floder:
>>>>>>> 9b988744b9094e235d0206c22ab1011802914ecc
>>>>>>> 93d9ef9bbb775d0c1b8c98405f600a1c4039aae8
                    name = 'GST_0CM'
                selected_root_types_year[name] = []  # 一个名字对应一个列表
                selected_year[name] = []
                selected_root_types_month[name] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]  # 对应着12个月份
                for txt_file in os.listdir(file + "\\" + floder):  # 进入到下一层文件中去
                    year = int(re.findall(r'\d{4}', txt_file)[-1])
                    if year not in selected_root_types_year[name]:
                        selected_root_types_year[name].append(int(year))
                selected_root_types_year[name] = sorted(set(selected_root_types_year[name]))
        else:
            flag = 1
            for txt_file in os.listdir(file):
                if '0cm' in txt_file or '0CM' in txt_file:  # 若0cm在文件名中，则一定为GST_0CM
                    types = 'GST_0CM'
                else:
                    for name in cd.day_factors:
                        if name in txt_file:  # 以文件名字作为标准
                            types = name
                            break
                year = re.findall(r'(\d{4})(\d{2})', txt_file)[0][0]
                if flag == 1:
                    selected_root_types_year[types] = []
                    selected_year[types] = []
                    selected_root_types_month[types] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
                    flag = 0
                if year not in selected_root_types_year[types]:
                    selected_root_types_year[types].append(int(year))
                selected_root_types_year[types] = sorted(set(selected_root_types_year[types]))
<<<<<<< HEAD

=======
>>>>>>> 9b988744b9094e235d0206c22ab1011802914ecc
        if len(list_root_name) != 0:
            rootList = []  # 根节点的列表，此变量对于TreeWidget而言
            for root_name in list_root_name:
                root = QTreeWidgetItem()  # 设置根节点
                root.setText(0, root_name)
                root.setCheckState(0, Qt.Unchecked)
                if "不处理" not in selected_root_child[root_name]:
                    selected_root_child[root_name].append("不处理")
                root.setText(1, tree_types_name[root_name][0])
                rootList.append(root)
                i = 1
                index = 0
                for child_name in tree_types_name[root_name][1:]:  # 根据树根找到子节点
                    # print("2: ", child_name, i, selected_root_types_montree_types_nameth)
                    if i < 7:
                        child = QTreeWidgetItem()
                        child.setText(2, child_name)
<<<<<<< HEAD
                        selected_root_child[root_name].insert(1, child_name)  # 一开始默认为全选
=======
                        if child_name not in selected_root_child[root_name]:
                            selected_root_child[root_name].insert(1, child_name)  # 一开始默认为全选
>>>>>>> 0f0c72be4dcc2e15fd778f6cbc949159bd679275
                        child.setText(3, tree_unit[root_name][tree_types_name[root_name].index(child_name) - 1])  # 寻找对应单位
                        if cd.special_check is True and child_name in ['经度', '纬度', '观测场拔海高度']:
                            child.setCheckState(2, Qt.Unchecked)
                            child.setDisabled(True)
                        else:
                            child.setCheckState(2, Qt.Checked)
                            child.setDisabled(False)
                        if i == 5:  # 处理年份的位置
                            for year in selected_root_types_year[root_name]:
                                child2 = QTreeWidgetItem()
                                child2.setText(2, "   └╌╌╌╌{}╌╌╌>".format(root_name))
                                child2.setText(3, str(year))
                                child2.setCheckState(3, Qt.Checked)
                                selected_year[root_name].append(year)
                                child.addChild(child2)
                            rootList[rootList.index(root)].addChild(child)  # 在根节点的位置插入孩子节点
                        if i == 6:  # 处理月份的位置
                            for month in selected_root_types_month[root_name]:
                                child2 = QTreeWidgetItem()
                                child2.setText(2, "    └╌╌╌╌{}╌╌╌>".format(root_name))
                                child2.setText(3, str(month))
                                child2.setCheckState(3, Qt.Checked)
                                child.addChild(child2)
                            rootList[rootList.index(root)].addChild(child)  # 在根节点的位置插入孩子节点
                        rootList[rootList.index(root)].addChild(child)  # 在根节点的位置插入孩子节点
                    else:
                        sec_root = QTreeWidgetItem()
                        sec_root.setText(2, child_name)
                        if child_name not in ['+1000', '+10000', '-10000', '32700', '32XXX', '31XXX', '30XXX', '+20000', '+300','+1000', '+100', '90X', '95X']:
<<<<<<< HEAD
                            selected_root_child[root_name].insert(1, child_name)  # 一开始默认为全选
=======
                            if child_name not in selected_root_child[root_name]:
                                selected_root_child[root_name].insert(1, child_name)  # 一开始默认为全选
>>>>>>> 0f0c72be4dcc2e15fd778f6cbc949159bd679275
                        sec_root.setText(3, tree_unit[root_name][tree_types_name[root_name].index(child_name) - 1])
                        if cd.special_check is True and '控制码' in child_name:
                            sec_root.setCheckState(2, Qt.Unchecked)
                            sec_root.setDisabled(True)
                        else:
                            sec_root.setCheckState(2, Qt.Checked)
                            sec_root.setDisabled(False)
                        child2 = QTreeWidgetItem()
                        if (root_name == 'PRS' and child_name == '+20000') or (root_name == 'RHU' and child_name == '+300') or (root_name == 'WIN' and child_name in ['+1000', '+100']) or (root_name == 'GST_0CM' and child_name in ['+10000', '-10000']) or (root_name == 'PRE' and child_name == '32700') or (root_name == 'EVP' and child_name == '+1000') or (root_name == '组合气象因子' and child_name in ['+20000', '32700']):
                            sec_root.setCheckState(2, Qt.Unchecked)
                            if child_name == '32700':
                                x = ['设为0']
                            else:
                                x = ['设为0', '提取出原值']
                            sec_root = MyMainForm.setSpecilTreeValue(self, root_name, tree_specil_exp[root_name][index], x, sec_root)
                            index += 1
                            rootList[rootList.index(root)].addChild(sec_root)  # 在根节点的位置插入孩子节点
                        elif (root_name == 'PRE' and child_name in ['32XXX', '31XXX', '30XXX']) or ( root_name == 'WIN' and child_name in ['90X', '95X'] ) :
                            sec_root.setCheckState(2, Qt.Unchecked)
                            sec_root = MyMainForm.setSpecilTreeValue(self, root_name, tree_specil_exp[root_name][0], ['设为0', '提取XXX'], sec_root)
                            rootList[rootList.index(root)].addChild(sec_root)  # 在根节点的位置插入孩子节点
                        else:
                            child2.setText(2, "      └╌╌╌╌╌╌╌╌╌>")
                            child2.setText(3, "替换")
                            if cd.special_check is True and '控制码' in child_name:
                                child2.setCheckState(3, Qt.Unchecked)
                                child2.setDisabled(True)
                            else:
                                child2.setCheckState(3, Qt.Checked)
                                child2.setDisabled(False)
                            sec_root.addChild(child2)
                            rootList[rootList.index(root)].addChild(sec_root)  # 在根节点的位置插入孩子节点
                    i += 1
            self.treeWidget.insertTopLevelItems(0, rootList)

    #@get_abnormal
    def setSpecilTreeValue(self, types, exp, loop_value, sec_root):
        # print("tree_specil_exp:", tree_specil_exp[types])
        #tree_specil_exp[types].remove(exp)  # 输出之后移除掉第0个，保证最前面的是正确对应着的特殊值解释值

        for k in loop_value:
            child2 = QTreeWidgetItem()
            child2.setText(2, "      └{}->".format(exp))
            child2.setText(3, k)
            child2.setCheckState(3, Qt.Unchecked)
            sec_root.addChild(child2)
        return sec_root

    #@get_abnormal
    def onclick(self, item, state):
        global tree_name_types
        if "组合气象因子" in self.data_floder:
            tree_name_types = comb_tree_name_types
        if item.parent() != None:  # 对于子节点而言
            # print("item0 {}, state1 {}".format(item.text(0), item.text(1)))
            types = item.parent().text(0)
            name = item.parent().text(2)  # 气象因素的名字
            number = item.text(2)
            # print(types, name, number)
            if item.checkState(state) == Qt.Unchecked:  # 如果是未选中的，则移除该选项3
                if number in ['+1000', '+10000', '-10000', '32700', '32XXX', '31XXX', '30XXX', '+20000', '+300','+1000', '+100', '90X', '95X']:
                    if number == '+1000':
                        if item.parent().text(0) == 'EVP':
                            disnumber_exp = number + '(蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000)'
                        else:
                            disnumber_exp = number + '(当风速超过仪器测量上限时,在上限数据基础上加1000)'
                    else:
                        disnumber_exp = number + specil_to_exp[number]  # 特值的组合 '+20000(气压极值取自定值时,在原值上加20000)'
                    if [item.parent().text(0), disnumber_exp] in specil_select_value:
                        specil_select_value.remove([item.parent().text(0), disnumber_exp])
                    count = item.childCount()
                    for i in range(count):
                        item.child(i).setCheckState(3, Qt.Unchecked)
                        specil_types_value[item.parent().text(0)][disnumber_exp].clear()
                if item.text(3) in ['设为0', '提取XXX', '提取出原值']:
                    if item.text(3) == '设为0':
                        specil_value = 0
                    elif item.text(3) == '提取XXX':
                        specil_value = 1
                    elif item.text(3) == '提取出原值':
                        specil_value = 2
                    exp = item.text(2)
                    exp = MyMainForm.get_exp_value(self, re.findall(r'(\w+)', exp))
                    rate, pois = 0.0, 0  # 前一个为相似率，后一个为位置
                    for v in specil_select_value:
                        k = MyMainForm.get_exp_value(self, re.findall(r'(\w+)', v[1]))  # 正则匹配值，进行下面的匹配
                        siml_rate = MyMainForm.get_equal_rate_1(self, exp, k)  # 和上面的数据进行匹配
                        if siml_rate > rate:
                            pois = specil_select_value.index(v)
                            rate = siml_rate  # 重置相似率
                    TYPES = specil_select_value[pois][0]
                    EXP = specil_select_value[pois][1]
                    if specil_value in specil_types_value[TYPES][EXP]:
                        specil_types_value[TYPES][EXP].remove(specil_value)
                if item.text(3) != "替换" and item.text(3).isdigit() == False and item.parent().text(2) not in ['+10000', '-10000', '32700', '32XXX', '31XXX', '30XXX', '+20000', '+300', '+1000', '+100', '90X', '95X']:
                    selected_root_child[types].remove(item.text(2))
                elif item.text(3) == '替换':
                    replace_type_name[tree_name_types[name]][name] = "不替换"
                else:
                    if item.text(3).isdigit() and len(item.text(3)) == 4:
                        types = re.findall(r'(\w{3,7})', item.text(2))[0]  # 寻找是哪一个气象因子的数据
                        selected_year[types].remove(int(item.text(3)))
                    if item.text(3).isdigit() and len(item.text(3)) < 3:
                        types = re.findall(r'(\w{3,7})', item.text(2))[0]  # 寻找是哪一个气象因子的数据
                        selected_root_types_month[types].remove(int(item.text(3)))
                # print("onclick_select_root_types:", selected_root_child[types])
            else:  # 如果选择了
                number = item.text(2)
                if number in ['+1000', '+10000', '-10000', '32700', '32XXX', '31XXX', '30XXX', '+20000', '+300', '+100', '90X', '95X']:
                    if number == '+1000':
                        if item.parent().text(0) == 'EVP':
                            disnumber_exp = number + '(蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000)'
                        else:
                            disnumber_exp = number + '(当风速超过仪器测量上限时,在上限数据基础上加1000)'
                    else:
                        disnumber_exp = number + specil_to_exp[number]  # 特值的组合 '+20000(气压极值取自定值时,在原值上加20000)'
                    specil_select_value.append([item.parent().text(0), disnumber_exp])
                else:  # 如果选择的不是二级选项，则自动选择进去
                    number = item.parent().text(2)
                    if number in ['+1000', '+10000', '-10000', '32700', '32XXX', '31XXX', '30XXX', '+20000', '+300',
                                  '+100', '90X', '95X']:
                        if number == '+1000':
                            if item.parent().parent().text(0) == 'EVP':
                                disnumber_exp = number + '(蒸发器中注入的水全部蒸发,在注入的水量数据基础上加1000)'
                            else:
                                disnumber_exp = number + '(当风速超过仪器测量上限时,在上限数据基础上加1000)'
                        else:
                            disnumber_exp = number + specil_to_exp[number]  # 特值的组合 '+20000(气压极值取自定值时,在原值上加20000)'
                        specil_select_value.append([item.parent().parent().text(0), disnumber_exp])
                    # print(specil_select_value)
                    if item.parent().checkState(2) == Qt.Unchecked:
                        item.parent().setCheckState(2, Qt.Checked)
                if item.text(3) in ['设为0', '提取XXX', '提取出原值']:
                    if item.text(3) == '设为0':
                        specil_value = 0
                    elif item.text(3) == '提取XXX':
                        specil_value = 1
                    elif item.text(3) == '提取出原值':
                        specil_value = 2
                    exp = item.text(2)
                    exp = MyMainForm.get_exp_value(self, re.findall(r'(\w+)', exp))
                    rate, pois = 0.0, 0 # 前一个为相似率，后一个为位置
                    for v in specil_select_value:
                        k = MyMainForm.get_exp_value(self, re.findall(r'(\w+)', v[1]))  # 正则匹配值，进行下面的匹配
                        siml_rate = MyMainForm.get_equal_rate_1(self, exp, k) # 和上面的数据进行匹配
                        if siml_rate > rate:
                            pois = specil_select_value.index(v)
                            rate = siml_rate  # 重置相似率
                    TYPES = specil_select_value[pois][0]
                    EXP = specil_select_value[pois][1]
                    specil_types_value[TYPES][EXP].append(specil_value)
                    if len(specil_types_value[TYPES][EXP]) == 2:  # 如果已经有了数据，则不能继续写入数据
                        msg_box = QMessageBox(QMessageBox.Warning, '选择错误', '一次只能选择一种处理方式')
                        specil_types_value[TYPES][EXP].remove(specil_value)
                        item.setCheckState(3, Qt.Unchecked)
                        msg_box.exec_()
                    # print(specil_types_value)
                if item.text(3) != "替换" and item.text(3).isdigit() == False and item.parent().text(2) not in ['+1000', '+10000', '-10000','32700','32XXX','31XXX','30XXX', '+20000','+300','+100','90X','95X']: # 这里只添加气象因子，特值不考虑
<<<<<<< HEAD
                    selected_root_child[types].insert(1, item.text(2))
=======
                    selected_root_child[types].insert(0, item.text(2))
>>>>>>> 0f0c72be4dcc2e15fd778f6cbc949159bd679275
                    # print(selected_root_child)
                elif item.text(3) == '替换':
                    replace_type_name[tree_name_types[name]][name] = "替换"
                else:
                    if item.text(3).isdigit() == True and len(item.text(3)) == 4:
                        types = re.findall(r'(\w{3})', item.text(2))[0]  # 寻找是哪一个气象因子的数据
                        selected_year[types].append(int(item.text(3)))
                    if item.text(3).isdigit() == True and len(item.text(3)) < 3:
                        types = re.findall(r'(\w{3})', item.text(2))[0]  # 寻找是哪一个气象因子的数据
                        selected_root_types_month[types].append(int(item.text(3)))
        else:  # 对于父亲节点而言，则没有父亲节点，即是None
            types = item.text(0)
            # print("父亲节点 item0 {}, state1 {}".format(item.text(0), item.text(1)))
            if item.checkState(state) == Qt.Unchecked:  # 如果是未选中的，则移除该选项3
                if "处理" in selected_root_child[types]:
                    selected_root_child[types].remove("处理")
            else:
<<<<<<< HEAD
                if "处理" not in selected_root_child[types]:
                    selected_root_child[types].append("处理")
=======
<<<<<<< HEAD
                if "处理" not in selected_root_child[types]:
                    selected_root_child[types].append("处理")
        # print(specil_types_value)
=======
                selected_root_child[types].append("处理")
>>>>>>> 0f0c72be4dcc2e15fd778f6cbc949159bd679275
        # print(selected_root_child[types])
>>>>>>> 93d9ef9bbb775d0c1b8c98405f600a1c4039aae8

    #@get_abnormal
    def getItem(self, types):
        items = ['不做处理','设为 0']
        k = 1
        for descripe in specil_types_value[types].keys():
            if 'XXX' in descripe and '提取出XXX' not in items:
                items.append('提取出XXX')
            elif 'XXX' not in descripe and '提取出XXX' in items:
                items.remove('提取出XXX')
            item, ok = QInputDialog.getItem(self, "特殊项{}/{}".format(k, len(specil_types_value[types].keys())), descripe, items, 0, True)
            if ok and item:
                if str(item) == '不做处理':
                    temp = -1
                elif str(item) == '设为 0':
                    temp = 0
                else:
                    temp = 1
                specil_types_value[types][descripe].append(temp)  # 第-1项为最后选择的一项
            k += 1

    # #@get_abnormal
    def getPrintFloder(self):
        file = QFileDialog.getExistingDirectory(self, directory=self.cwd).replace("/", "\\")  # 获取文件
        self.text_print.setText(file)

    # #@get_abnormal
    def getPublicFile(self):
        file, types = QFileDialog.getOpenFileName(self, "选择文件", "/", "All Files (*);;Text Files (*.xlsx)")
        # file = QFileDialog.getOpenFileName(self, directory=self.cwd).replace("/", "\\")  # 获取文件
        self.text_public_floder.setText(file.replace("/", "\\"))
        temp = self.text_public_floder.text()  # 获得文件夹
        if 'xlsx' not in temp and temp != '':
            msg_box = QMessageBox(QMessageBox.Warning, '格式错误', '无法处理非xlsx后缀名的文件，可将文件另存为xlsx格式的在处理')
            msg_box.exec_()
        else:
            self.replace_file = temp

    # #@get_abnormal
    def getLoseValue(self):  # 如果被修改了，表明是要缺失处理的
        self.lose_value = self.text_lose.text()  # 获取缺失值的内容
        num = re.findall(r'(\d+|-\d+)', self.lose_value)  # 获取数据
        num = 0 if len(num) == 0 else len(num[0])
        if num == 0:
            self.lose_value = '缺失'
            self.lose_value_flag = '否'
            self.flag = 1
        else:
            if num != len(self.lose_value):
                msg_box = QMessageBox(QMessageBox.Warning, '输入错误', '缺失值只能为数字或者空')
                msg_box.exec_()
            elif len(self.lose_value) == 0:
                self.lose_value = '缺失'
                self.lose_value_flag = '否'
                self.flag = 1
            else:
                self.flag = 1  # 若 缺失值 的栏输入没问题
                self.lose_value_flag = '是'

    #@get_abnormal
    def getTrueValue(self):
        if self.float_value_flag == '是':  # 如果选择了 真实值转换
            self.float_value = self.text_float.text()  # 获取系数
        else:
            self.float_value = 0.1  # 设置为默认值

    # #@get_abnormal
    def starButtn(self):
        self.out_floder = self.text_print.text()  # 获得值
        self.step = 0
        if self.conform_file != '':   # 如果整合文件不为空
            self.run_thread = MyThread()
            self.run_thread.getConformFile(self.conform_file)
            self.run_thread.start()
            self.conform_file = ""  # 使用完毕后设定为空
            self.text_conform_file.setText("")
        if self.out_floder == '' or self.data_floder == '':
            # msg_box = QMessageBox(QMessageBox.Warning, '文件错误', '输入内容不能为空')
            # msg_box.exec_()
            print("未检测到有数据集")
        elif self.flag == 0:
            msg_box = QMessageBox(QMessageBox.Warning, '输入错误', '缺失值只能为数字或者空')
            msg_box.exec_()
            self.flag = 0
        else:
            self.run_thread1 = MyThread()
<<<<<<< HEAD
            temp_select_root_child = copy.deepcopy(selected_root_child)
            for name in temp_select_root_child:
                for temp in temp_select_root_child[name]:
                    if temp in ['+1000', '+10000', '-10000', '32700', '32XXX', '31XXX', '30XXX', '+20000', '+300', '+1000', '+100', '90X', '95X']:
                        selected_root_child[name].remove(temp)
                        selected_root_child[name].append(temp)

=======
            for name in selected_root_child:
                index = 0
                if len(selected_root_child[name]) != 0:
                    for k in range(0, len(selected_root_child[name])):
                        t = selected_root_child[name][index]
                        if t in ['经度', '纬度', '观测场拔海高度'] or '控制码' in t:
                            selected_root_child[name].remove(t)
                        else:
                            index += 1
            # print("select_root_child:", selected_root_child)
>>>>>>> 0f0c72be4dcc2e15fd778f6cbc949159bd679275
            self.run_thread1.getInfo(self.data_floder, self.out_floder, self.float_value_flag, self.float_value,
                                    self.lose_value_flag, self.lose_value, self.separate_value, selected_root_child, self.replace_falg, self.replace_file,
                                     self.dist_num, self.province, self.site_num, self.long, self.lat, self.alt,
                                     selected_year, selected_root_types_month, specil_types_value, specil_select_value)  # 要处理的年份和月份
            self.run_thread1.start()

    def endButtn(self):
        sys.exit(app.exec_())

    def floatState(self, state):
        self.float_value_flag = '是' if state == Qt.Checked else '否'


    def publicState(self, state):
        self.replace_falg = '是' if state == Qt.Checked else '否'

    def separateState(self, state):
        self.separate_value = '是' if state == Qt.Checked else '否'

    def getFloders(self):  # 返回值：数据集，输出，缺失处理，小数处理
        return self.data_floder, self.out_floder, self.lose_value, self.float_value


'''处理txt数据的线程'''


class MyThread(QThread):
    def __init__(self):
        super(MyThread, self).__init__()
        self.f1 = ''
        self.f2 = ''
        self.fvf = ''
        self.fv = ''
        self.lvf = ''
        self.lv = ''
        self.sheet = ''
        self.sev = ''
        self.rflag = ''
        self.rfile = ''
        self.confile = ''  # 整合文件
        self.Demo = MyTxtToExcel()

    def getInfo(self, data_floder, out_floder, float_value_flag, float_value, lose_value_flag, lose_value, separate, selected_root_child, replace_flag, replace_file, dist_num, province, site_num, long, lat, alt, syear, smonth, specil, specil_select_value):
        self.f1 = data_floder
        self.f2 = out_floder
        self.fvf = float_value_flag
        self.fv = float_value
        self.lvf = lose_value_flag
        self.lv = lose_value
        self.sheet = selected_root_child
        self.sev = separate
        self.rflag = replace_flag
        self.rfile = replace_file
        self.dn = dist_num
        self.pro = province
        self.sn = site_num
        self.long = long
        self.lat = lat
        self.alt = alt
        self.syear = syear
        self.smonth = smonth
        self.specil_value = specil
        self.speicil_select = specil_select_value
    def getConformFile(self, file):
        self.confile = file

    def run(self):
        if self.confile != '':
            self.Demo.conformExcelData(self.confile)
        else:
            self.Demo.putInfos(self.f1, self.f2, self.fvf, self.fv, self.lvf, self.lv, self.sev, self.sheet, replace_type_name, self.rflag, self.rfile,
                               self.dn, self.pro, self.sn, self.long, self.lat, self.alt, self.syear, self.smonth,
                               self.specil_value, self.speicil_select)   # 后续是更改的表头数据，区站号什么的

    def getTotalDecl(self):
        return self.Demo.getBarNum()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = MyMainForm()
    myWin.show()
    sys.exit(app.exec_())
